/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.view.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.dto.ProductoDto;
import com.brain.core.dto.SocioNegocioDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.ProductoManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.util.ApplicationHelper;
import com.brain.core.view.util.ConstantesCore;

import javax.faces.event.ActionEvent;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller("productoMBean")
@Scope("session")
public class ProductoMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(ProductoMBean.class);
    
    @Resource
    private ProductoManager manager;
    @Resource
    private RecursosManager recursosManager;
    private List<ProductoDto> lista;
    private ProductoDto dto;
    private ProductoDto dtoFiltro;
    private String keyTitulo = "producto.panel";
    private List<ParametroDto> siNivel1;
    private List<ParametroDto> siNivel2;
    private List<ParametroDto> siNivel3;
    
    
    private List<ParametroDto> siMonedas;
    private List<ParametroDto> siUnidadesMedida;    
    
    
    @Autowired
    private ApplicationMBean applicationMBean;
    
    @Autowired
    private SessionMBean sessionMBean;

    public ProductoMBean() {
       // sessionMBean.setAccion(ConstantesWeb.Formulario.LISTA);
        //sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dtoFiltro = new ProductoDto();        
        this.dtoFiltro.setRepresentadaDto(new SocioNegocioDto());
    }

    public String iniciar () {
        this.lista = null;     
        this.dto = null;
       this.dtoFiltro = new ProductoDto();        
        this.dtoFiltro.setRepresentadaDto(new SocioNegocioDto());           
        return ConstantesCore.UrlNavegacion.URL_LISTA_PRODUCTOS;
    }
    
    public String nuevo() {
        sessionMBean.setAccion(ConstantesCore.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));        
        this.dto = new ProductoDto();    
        this.dto.setId(null);
        this.dto.setEstado(Boolean.TRUE);
        this.dto.setAutogenerarSku(Boolean.TRUE);
        this.dto.setEsServicio(Boolean.FALSE);
        this.dto.setPrecioCompra(BigDecimal.ZERO);
        this.dto.setPrecioVenta(BigDecimal.ZERO);
        this.dto.setDescuentoCompra(BigDecimal.ZERO);
        this.dto.setDescuentoVenta(BigDecimal.ZERO);
        this.dto.setStockActual(BigDecimal.ZERO);
        this.dto.setStockMaximo(BigDecimal.ZERO);
        this.dto.setStockMinimo(BigDecimal.ZERO);
        this.dto.setUnidadMedidaDto(ApplicationHelper.obtenerParametroPorId(ConstantesCore.ValoresDefecto.UNIDAD_MEDIDA));
        this.dto.setMonedaCompraDto(ApplicationHelper.obtenerParametroPorId(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO));
        this.dto.setMonedaVentaDto(ApplicationHelper.obtenerParametroPorId(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO));
        return ConstantesCore.UrlNavegacion.URL_PRODUCTO;
    }

    public String editar() {
        sessionMBean.setAccion(ConstantesCore.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        ApplicationHelper.cargarPropietarios(ConstantesCore.Entidad.PRODUCTO, this.dto.getId());
        ApplicationHelper.cargarBitacoraEntidad(ConstantesCore.Entidad.PRODUCTO, this.dto.getId());
        return ConstantesCore.UrlNavegacion.URL_PRODUCTO;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesCore.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        ApplicationHelper.cargarPropietarios(ConstantesCore.Entidad.PRODUCTO, this.dto.getId());
        ApplicationHelper.cargarBitacoraEntidad(ConstantesCore.Entidad.PRODUCTO, this.dto.getId());
        return ConstantesCore.UrlNavegacion.URL_PRODUCTO;
    }
    
//    public List<SocioNegocioDto> autoCompletarRepresentada(String query) {        
//        List<SocioNegocioDto> results = new ArrayList<SocioNegocioDto>();        
//        for (SocioNegocioDto t : this.applicationMBean.getListaSociosNegocios()) {  
//            if (t.getDescripcion().toUpperCase().indexOf(query.toUpperCase())>=0)
//                results.add(t);            
//        }
//        return results;
//    }

    public void buscar(ActionEvent ae) {
        
        try {
            this.lista = this.manager.obtenerProductosMantenimiento(dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }
    
    public void seleccionarLinea(SelectEvent event){
        this.dto.setNivel2Dto(this.dto.getNivel3Dto().getParametroPadreDto());
        this.dto.setNivel1Dto(this.dto.getNivel3Dto().getParametroPadreDto().getParametroPadreDto());
    }


    public String guardar() {
        String to = null;
        String mensajeTrx = "";

        {
            this.dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
            this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            this.dto.setTerminal(sessionMBean.getSessionTerminal());                        
        }
        
        if (sessionMBean.getAccion() == ConstantesCore.Formulario.NUEVO) {
            try {                
                UtilCore.General.toUpperCaseDto(this.dto);
                this.manager.nuevo(this.dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                showMessage(mensajeTrx);                
                to = back();
            } catch (Exception ex) {
                showError(ex.getMessage());
                to = null;
            }
        }else if (sessionMBean.getAccion() == ConstantesCore.Formulario.EDITAR) {
            try {
                UtilCore.General.toUpperCaseDto(this.dto);
                this.manager.editar(this.dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                showMessage(mensajeTrx);                
                to = back();
            } catch (Exception ex) {
                showError(ex.getStackTrace().toString());
                ex.getStackTrace();
                to = null;
            }
        }
        return to;
    }

    public String back() {
        this.dtoFiltro = new ProductoDto();        
        this.dtoFiltro.setRepresentadaDto(new SocioNegocioDto());           
        this.dtoFiltro.setId(this.dto.getId());
        buscar(null);
        sessionMBean.setAccion(ConstantesCore.Formulario.LISTA);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return ConstantesCore.UrlNavegacion.URL_LISTA_PRODUCTOS;
    }
    
    public String retroceder() {
      
        sessionMBean.setAccion(ConstantesCore.Formulario.LISTA);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return ConstantesCore.UrlNavegacion.URL_LISTA_PRODUCTOS;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public ProductoDto getDto() {
        return dto;
    }

    public void setDto(ProductoDto dto) {
        this.dto = dto;
    }

    public ProductoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(ProductoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<ProductoDto> getLista() {
        return lista;
    }

    public void setLista(List<ProductoDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ProductoMBean.logger = logger;
    }

    public ProductoManager getManager() {
        return manager;
    }

    public void setManager(ProductoManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<ParametroDto> getSiMonedas() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.MONEDAS_DEL_SISTEMA);
    }

    public void setSiMonedas(List<ParametroDto> siMonedas) {
        this.siMonedas = siMonedas;
    }

    public List<ParametroDto> getSiNivel1() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.PRODUCTO_NIVEL_1);
    }

    public void setSiNivel1(List<ParametroDto> siNivel1) {
        this.siNivel1 = siNivel1;
    }

    public List<ParametroDto> getSiNivel2() {        
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.PRODUCTO_NIVEL_2,this.dto.getNivel1Dto());
    }

    public void setSiNivel2(List<ParametroDto> siNivel2) {
        this.siNivel2 = siNivel2;
    }

    public List<ParametroDto> getSiNivel3() {    
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.PRODUCTO_NIVEL_3,this.dto.getNivel2Dto());
    }

    public void setSiNivel3(List<ParametroDto> siNivel3) {
        this.siNivel3 = siNivel3;
    }
   

    public List<ParametroDto> getSiUnidadesMedida() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogo(ConstantesCore.CatalogoParametro.PRODUCTO_UNIDAD_MEDIDA);
    }

    public void setSiUnidadesMedida(List<ParametroDto> siUnidadesMedida) {
        this.siUnidadesMedida = siUnidadesMedida;
    }

    
    
}
